{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 词向量加权生成句子向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sqlite3 Version：2.6.0  \n",
      "jieba Version：0.42.1  \n",
      "numpy Version：1.16.0  \n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import sqlite3\n",
    "import numpy as np\n",
    "import jieba.posseg as pseg\n",
    "import jieba\n",
    "\n",
    "print('sqlite3 Version：{}  '.format(sqlite3.version))\n",
    "print('jieba Version：{}  '.format(jieba.__version__))\n",
    "print('numpy Version：{}  '.format(np.__version__))\n",
    "\n",
    "# SQLite 数据库操作\n",
    "class SQLite:\n",
    "    # 初始化 连接数据库\n",
    "    def __init__(self, database, embedding_table, debug=False):\n",
    "        \"\"\"\n",
    "        :param database:         数据库名称\n",
    "        :param embedding_table:  词向量存储表名\n",
    "        \"\"\"\n",
    "\n",
    "        self.debug = debug\n",
    "\n",
    "        # 数据库名称\n",
    "        self.database = database\n",
    "\n",
    "        # 连接数据库\n",
    "        self.db = sqlite3.connect(database=database)\n",
    "        # 使用 cursor() 方法创建一个游标对象 cursor\n",
    "        self.cursor = self.db.cursor()\n",
    "\n",
    "        # 词向量表名\n",
    "        self.embedding_table = embedding_table\n",
    "        print('Connection <{}> Successful. DataBase Version: <{}>'.format(\n",
    "            database, self.select(\"select sqlite_version();\")[0][0]))\n",
    "\n",
    "        # 查看系统中的所有表\n",
    "        db_table = [t_i[0] for t_i in self.select(\"select name from sqlite_master where type='table' order by name\")]\n",
    "        print(\"数据库 {} 中的所有表格：{}\".format(database, db_table))\n",
    "\n",
    "    # 数据库查询\n",
    "    def select(self, sql_code):\n",
    "        \"\"\"\n",
    "        :param sql_code:   SQL 查询代码\n",
    "        :return:   返回查询结果\n",
    "        \"\"\"\n",
    "        try:\n",
    "            self.cursor.execute(sql_code)\n",
    "            return self.cursor.fetchall()\n",
    "\n",
    "        except Exception as error:\n",
    "            print(\"Error:\\n{}\\nINSERT Error:{}\".format(sql_code, repr(error)))\n",
    "            return False\n",
    "\n",
    "    # 查询词向量\n",
    "    def search_embedding(self, search_word):\n",
    "        \"\"\"\n",
    "        :param search_word:  待查找词列表\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        sql_select = \"SELECT * FROM {} where word in ('{}')\".format(self.embedding_table, \"','\".join(search_word))\n",
    "        result = self.select(sql_select)\n",
    "\n",
    "        # 以字典形式返回查询的词向量\n",
    "        if result:\n",
    "            return {r_i[0]: r_i[1:] for r_i in result}\n",
    "        else:\n",
    "            return False\n",
    "\n",
    "    # 关闭数据库\n",
    "    def close(self):\n",
    "        # 关闭 cursor\n",
    "        self.cursor.close()\n",
    "        # 关闭 数据库连接\n",
    "        self.db.close()\n",
    "\n",
    "\n",
    "# 句子 Embedding 生成\n",
    "def sentence_embedding(embedding_search, word_weight_dict, sentence_x, debug=False):\n",
    "    \"\"\"\n",
    "    :param embedding_search:   词向量查询\n",
    "    :param word_weight_dict:   词权重\n",
    "    :param sentence_x:         输入句子\n",
    "    :param debug:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    used_word = list()\n",
    "    # jieba 切词，根据词性筛选词\n",
    "    for word, flag in pseg.cut(sentence_x):\n",
    "        if debug:\n",
    "            print('{} {} '.format(word, flag))\n",
    "\n",
    "        # n\t普通名词\tf\t方位名词\ts\t处所名词\tt\t时间\n",
    "        # nr\t人名\tns\t地名\tnt\t机构名\tnw\t作品名\n",
    "        # nz\t其他专名\tv\t普通动词\tvd\t动副词\tvn\t名动词\n",
    "        # a\t形容词\tad\t副形词\tan\t名形词\td\t副词\n",
    "        # m\t数量词\tq\t量词\tr\t代词\tp\t介词\n",
    "        # c\t连词\tu\t助词\txc\t其他虚词\tw\t标点符号\n",
    "        # PER\t人名\tLOC\t地名\tORG\t机构名\tTIME\t时间\n",
    "\n",
    "        # TODO 根据实际情况调节\n",
    "        # if flag not in ('c', 'u', 'xc', 'w', 'q', 'r', 'p', 'm', 'a', 'x'):\n",
    "        # if flag in ('n', 'f', 's', 'nr', 'ns', 'nt', 'nw', 'nz', 'v', 'vd', 'vn', 'PER', 'LOC', 'ORG'):\n",
    "        if flag in ('n', 'f', 's', 'nr', 'ns', 'nt', 'nw', 'nz', 'PER', 'LOC', 'ORG'):\n",
    "            used_word.append(word)\n",
    "\n",
    "    # 数据库检索词向量\n",
    "    used_word_embedding = embedding_search.search_embedding(used_word)\n",
    "\n",
    "    # 无 Embedding 词\n",
    "    non_embedding_word = list(set(used_word) - set(used_word_embedding.keys()))\n",
    "\n",
    "    if debug:\n",
    "        print('筛选词：{}'.format(used_word))\n",
    "        print('无 Embedding词： {}'.format(non_embedding_word))\n",
    "\n",
    "    # #############################################################\n",
    "    # 词权重  TODO 可根据实际情况继续优化 如 TFIDF\n",
    "    # word_weight = [1 for word_i in used_word_embedding.keys()]\n",
    "\n",
    "    word_weight = list()\n",
    "    for word_i in used_word_embedding.keys():\n",
    "        if word_i in word_weight_dict:\n",
    "            word_weight.append(word_weight_dict[word_i])\n",
    "        else:\n",
    "            word_weight.append(word_weight_dict['_Non'])\n",
    "\n",
    "    # 词 Embedding\n",
    "    word_embedding = np.array(list(used_word_embedding.values()))\n",
    "    # Embedding 修正\n",
    "    word_embedding *= np.array(word_weight).reshape((-1, 1))\n",
    "\n",
    "    # ##############################################################\n",
    "    # TODO 无 Embedding 词以hash 值随机生成\n",
    "    non_embedding_l = list()\n",
    "    # for word_i in non_embedding_word:\n",
    "\n",
    "    #     np.random.seed(hash(word_i) % 1000000000)\n",
    "    #     non_embedding_l.append(np.random.normal(scale=0.5, size=word_embedding.shape[1]))\n",
    "\n",
    "    non_embedding = np.array(non_embedding_l)\n",
    "\n",
    "    # ##############################################################\n",
    "    # 平均Embedding\n",
    "    if len(non_embedding) > 0:\n",
    "        word_embedding_mean = np.concatenate((word_embedding, non_embedding), axis=0).mean(axis=0)\n",
    "    else:\n",
    "        word_embedding_mean = word_embedding.mean(axis=0)\n",
    "\n",
    "    # 返回词性筛选后词，数据库无Embedding词， 均值句子Embedding\n",
    "    return used_word, non_embedding_word, word_embedding_mean\n",
    "\n",
    "\n",
    "# 根据词向量计算词之间的余弦相似度矩阵  【衡量两个向量方向的差异】\n",
    "def cos_similar(np_a, np_b):\n",
    "    \"\"\"\n",
    "    :param np_a:  词向量 np 格式\n",
    "    :param np_b:  词向量 np 格式\n",
    "    :return:  相似度矩阵 词数量*词数量\n",
    "    \"\"\"\n",
    "    # 若 np_a、 np_b 为一维向量，将其 reshape 为 2维向量\n",
    "    if len(np_a.shape) == 1:\n",
    "        np_a = np_a.reshape(1, -1)\n",
    "    if len(np_b.shape) == 1:\n",
    "        np_b = np_b.reshape(1, -1)\n",
    "\n",
    "    # 计算 np_a 的 2范数\n",
    "    a_norm = np.linalg.norm(np_a, axis=1)\n",
    "    a_norm = a_norm.reshape(-1, 1)\n",
    "\n",
    "    # 计算 np_b 的 2范数\n",
    "    b_norm = np.linalg.norm(np_b, axis=1)\n",
    "    b_norm = b_norm.reshape(1, -1)\n",
    "\n",
    "    # 余弦相似度 【防止分母为 0 输出为Nan 加上一个极小数 1e-8 】\n",
    "    cos_similar_score = np_a.dot(np_b.T) / (a_norm.dot(b_norm) + 1e-8)\n",
    "\n",
    "    return cos_similar_score\n",
    "\n",
    "\n",
    "# 计算词的 TFIDF 权重\n",
    "def tf_idf(corpus_train):\n",
    "    \"\"\"\n",
    "    from sklearn.feature_extraction.text import CountVectorizer\n",
    "    :param corpus_train:   ['A B C D E F', 'A B C', 'C E', 'A B E F', 'A B D']\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    from sklearn.feature_extraction.text import CountVectorizer\n",
    "\n",
    "    # 创建模型，    # token_pattern=u'\\S+'\n",
    "    vectorization = CountVectorizer(ngram_range=(1, 1), max_df=1.0,\n",
    "                                    token_pattern=u'[\\u4e00-\\u9fa5]+|[a-zA-Z0-9]{1,10}')\n",
    "\n",
    "    # 转化为词频矩阵\n",
    "    vectorization_fit = vectorization.fit_transform(corpus_train)\n",
    "    x_array = vectorization_fit.toarray()  # 计算词频并转成词频矩阵\n",
    "\n",
    "    # 获取词袋模型中的所有词语\n",
    "    word_dict = vectorization.get_feature_names()\n",
    "\n",
    "    # 计算 TFIDF\n",
    "    doc_f = x_array > 0  # 各个词在文档中出现的次数\n",
    "    doc_f = doc_f.sum(axis=0)\n",
    "\n",
    "    word_tf = x_array.sum(axis=0) / x_array.sum()  # 每个词的 词出现频率\n",
    "    word_idf = np.log(len(x_array) / (doc_f + 1))  # 每个词的 逆文档频率\n",
    "    word_tf_idf = word_tf * word_idf  # 每个词的 TF-IDF\n",
    "\n",
    "    # 词TF-IDF 归一化\n",
    "    word_tf_idf = dict(zip(word_dict, word_tf_idf / max(word_tf_idf)))\n",
    "\n",
    "    return word_tf_idf\n",
    "\n",
    "\n",
    "# 获取词的 TFIDF 权重\n",
    "def get_word_weight(data):\n",
    "    # 计算词 TFIDF 权重\n",
    "    # 所有课程名称文本\n",
    "    text_all = [text_i for values in data.values() for text_i in values]\n",
    "    corpus = list()\n",
    "    for text_i in text_all:\n",
    "        used_word = list()\n",
    "        # jieba 切词，根据词性筛选词\n",
    "        for word, flag in pseg.cut(text_i):\n",
    "            if True:\n",
    "                print('{} {} '.format(word, flag))\n",
    "\n",
    "            # n\t普通名词\tf\t方位名词\ts\t处所名词\tt\t时间\n",
    "            # nr\t人名\tns\t地名\tnt\t机构名\tnw\t作品名\n",
    "            # nz\t其他专名\tv\t普通动词\tvd\t动副词\tvn\t名动词\n",
    "            # a\t形容词\tad\t副形词\tan\t名形词\td\t副词\n",
    "            # m\t数量词\tq\t量词\tr\t代词\tp\t介词\n",
    "            # c\t连词\tu\t助词\txc\t其他虚词\tw\t标点符号\n",
    "            # PER\t人名\tLOC\t地名\tORG\t机构名\tTIME\t时间\n",
    "\n",
    "            # TODO 根据实际情况调节\n",
    "            # if flag not in ('c', 'u', 'xc', 'w', 'q', 'r', 'p', 'm', 'a', 'x'):\n",
    "            # if flag in ('n', 'f', 's', 'nr', 'ns', 'nt', 'nw', 'nz', 'v', 'vd', 'vn', 'PER', 'LOC', 'ORG'):\n",
    "            if flag in ('n', 'f', 's', 'nr', 'ns', 'nt', 'nw', 'nz', 'PER', 'LOC', 'ORG'):\n",
    "                used_word.append(word)\n",
    "\n",
    "        corpus.append(' '.join(used_word))\n",
    "\n",
    "    # TODO 文档频率可优化为各个当前课程频率\n",
    "    word_weight = tf_idf(corpus)\n",
    "\n",
    "    # 权重均值做为 默认权重\n",
    "    word_weight['_Non'] = sum(word_weight.values()) / len(word_weight)\n",
    "    return word_weight\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache C:\\Users\\stuvi\\AppData\\Local\\Temp\\jieba.cache\n",
      "Loading model cost 0.985 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "有趣 a \n",
      "的 uj \n",
      "心理学 n \n",
      "： x \n",
      "职场 n \n",
      "创业 n \n",
      "营销 vn \n",
      "必备 v \n",
      "创业 n \n",
      "思维 n \n",
      "： x \n",
      "菜鸟 n \n",
      "该 r \n",
      "如何 r \n",
      "创业 n \n",
      "商业模式 n \n",
      "精讲 v \n",
      "如何 r \n",
      "写 v \n",
      "商业 n \n",
      "计划书 n \n",
      "新手 n \n",
      "开 v \n",
      "公司 n \n",
      "课程 n \n",
      "思维 n \n",
      "导图 n \n",
      "菜鸟 n \n",
      "的 uj \n",
      "速成 v \n",
      "秘籍 n \n",
      "最强 a \n",
      "思维 n \n",
      "导图 n \n",
      "训练营 n \n",
      "高效 a \n",
      "脑图 n \n",
      "： x \n",
      "xmind8 eng \n",
      "  x \n",
      "零 m \n",
      "基础 n \n",
      "专项 n \n",
      "班 n \n",
      "思维 n \n",
      "导图 n \n",
      "入门 ns \n",
      "到 v \n",
      "精通 a \n",
      "职场 n \n",
      "晋级 nr \n",
      "秘籍 n \n",
      "思维 n \n",
      "导图 n \n",
      "高效 a \n",
      "学习 v \n",
      "法 j \n",
      "告别 v \n",
      "低效 a \n",
      "， x \n",
      "人人 n \n",
      "必备 v \n",
      "的 uj \n",
      "聪明 a \n",
      "工作 vn \n",
      "法 j \n",
      "时间 n \n",
      "管理 vn \n",
      "神器 n \n",
      "- x \n",
      "OmniFocus eng \n",
      "  x \n",
      "for eng \n",
      "  x \n",
      "iOS eng \n",
      "跟 p \n",
      "邹 nr \n",
      "小强 nr \n",
      "学 n \n",
      "用 p \n",
      "滴答 o \n",
      "清单 a \n",
      "和 c \n",
      "秋叶 t \n",
      "一起 m \n",
      "学 n \n",
      "时间 n \n",
      "管理 vn \n",
      "时间 n \n",
      "管理 vn \n",
      "神器 n \n",
      "- x \n",
      "OmniFocus eng \n",
      "  x \n",
      "for eng \n",
      "  x \n",
      "Mac eng \n",
      "跟 p \n",
      "邹 nr \n",
      "小强 nr \n",
      "学 n \n",
      "目标 n \n",
      "管理 vn \n",
      "- x \n",
      "年度计划 n \n",
      "如何 r \n",
      "把握 v \n",
      "职场 n \n",
      "新 a \n",
      "机会 n \n",
      "明星 nr \n",
      "学长 n \n",
      "手把手 n \n",
      "教 v \n",
      "你 r \n",
      "成为 v \n",
      "“ x \n",
      "面霸 v \n",
      "” x \n",
      "真正 d \n",
      "的 uj \n",
      "跳槽 n \n",
      "技巧 n \n",
      "， x \n",
      "是 v \n",
      "什么 r \n",
      "样子 n \n",
      "的 uj \n",
      "？ x \n",
      "Offer eng \n",
      "收割 v \n",
      "术 v \n",
      "： x \n",
      "15 m \n",
      "位 v \n",
      "HR eng \n",
      "圆 vg \n",
      "你 r \n",
      "大厂 n \n",
      "梦 n \n",
      "生涯规划 l \n",
      "咨询师 n \n",
      "教 v \n",
      "你 r \n",
      "如何 r \n",
      "修改 v \n",
      "简历 v \n",
      "个人 n \n",
      "知识 v \n",
      "管理 vn \n",
      "— x \n",
      "— x \n",
      "为 p \n",
      "知 v \n",
      "笔记 n \n",
      "印象 n \n",
      "笔记 n \n",
      "— x \n",
      "构建 v \n",
      "你 r \n",
      "的 uj \n",
      "第二 m \n",
      "大脑 n \n",
      "系统 n \n",
      "Markdown eng \n",
      "使用 v \n",
      "教程 n \n",
      "（ x \n",
      "0.5 m \n",
      "小时 n \n",
      "精通 a \n",
      "） x \n",
      "秀 ag \n",
      "米 q \n",
      "微信 vn \n",
      "公众 n \n",
      "号 m \n",
      "排版 v \n",
      "实战 v \n",
      "教程 n \n",
      "有 v \n",
      "道 q \n",
      "云 n \n",
      "笔记 n \n",
      "和 c \n",
      "有 v \n",
      "道 q \n",
      "云 n \n",
      "协作 vn \n",
      "视频教程 n \n",
      "高效 a \n",
      "经理 n \n",
      "的 uj \n",
      "7 m \n",
      "项 n \n",
      "实战 v \n",
      "领导 n \n",
      "学 n \n",
      "  x \n",
      "  x \n",
      "成长型 n \n",
      "企业家 n \n",
      "必修课 n \n",
      "创新型 n \n",
      "组织 v \n",
      "行为 v \n",
      "模式 n \n",
      "- x \n",
      "组织 v \n",
      "行为学 l \n",
      "【 x \n",
      "英盛 nz \n",
      "网 n \n",
      "】 x \n",
      "管理者 n \n",
      "培训班 n \n",
      "如何 r \n",
      "成为 v \n",
      "一名 m \n",
      "优秀 a \n",
      "的 uj \n",
      "领导者 n \n",
      "— x \n",
      "— x \n",
      "《 x \n",
      "领导力 n \n",
      "挑战 vn \n",
      "》 x \n",
      "超 v \n",
      "实用 v \n",
      "商务礼仪 n \n",
      "十堂 m \n",
      "礼仪 n \n",
      "课 n \n",
      "， x \n",
      "轻松 a \n",
      "HOLD eng \n",
      "住 v \n",
      "各种 r \n",
      "场合 n \n",
      "12 m \n",
      "堂 q \n",
      "声音 n \n",
      "美化 ns \n",
      "课 n \n",
      "， x \n",
      "全面 n \n",
      "提升 v \n",
      "个人 n \n",
      "魅力 n \n",
      "升职 v \n",
      "加薪 nr \n",
      "： x \n",
      "新人 n \n",
      "职业 n \n",
      "发展 vn \n",
      "必备 v \n",
      "技能 n \n",
      "个人 n \n",
      "品牌 n \n",
      "入门 ns \n",
      "到 v \n",
      "精通 a \n",
      "职场 n \n",
      "加速器 n \n",
      "  x \n",
      "| x \n",
      "  x \n",
      "加速 v \n",
      "职场 n \n",
      "成长 v \n",
      "重构 n \n",
      "你 r \n",
      "喜爱 v \n",
      "的 uj \n",
      "人生 n \n",
      "职场 n \n",
      "向上 d \n",
      "管理 vn \n",
      "： x \n",
      "如何 r \n",
      "搞定 v \n",
      "你 r \n",
      "的 uj \n",
      "老板 n \n",
      "突围 n \n",
      "职业规划 n \n",
      "， x \n",
      "如何 r \n",
      "找 v \n",
      "份 q \n",
      "好 a \n",
      "工作 vn \n",
      "高效 a \n",
      "迭代 v \n",
      "： x \n",
      "30 m \n",
      "天 q \n",
      "赢 v \n",
      "在 p \n",
      "职业生涯 n \n",
      "起点 n \n",
      "Connection <D:\\PreTrainedModel\\WordEmbedding.db> Successful. DataBase Version: <3.21.0>\n",
      "数据库 D:\\PreTrainedModel\\WordEmbedding.db 中的所有表格：['GitEmbedding']\n",
      "商业实战\n",
      "\n",
      "\n",
      " 有趣的心理学：职场创业营销必备\n",
      "有趣 a \n",
      "的 uj \n",
      "心理学 n \n",
      "： x \n",
      "职场 n \n",
      "创业 n \n",
      "营销 vn \n",
      "必备 v \n",
      "筛选词：['心理学', '职场', '创业']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 创业思维：菜鸟该如何创业\n",
      "创业 n \n",
      "思维 n \n",
      "： x \n",
      "菜鸟 n \n",
      "该 r \n",
      "如何 r \n",
      "创业 n \n",
      "筛选词：['创业', '思维', '菜鸟', '创业']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 商业模式精讲\n",
      "商业模式 n \n",
      "精讲 v \n",
      "筛选词：['商业模式']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 如何写商业计划书\n",
      "如何 r \n",
      "写 v \n",
      "商业 n \n",
      "计划书 n \n",
      "筛选词：['商业', '计划书']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 新手开公司课程\n",
      "新手 n \n",
      "开 v \n",
      "公司 n \n",
      "课程 n \n",
      "筛选词：['新手', '公司', '课程']\n",
      "无 Embedding词： []\n",
      "思维导图\n",
      "\n",
      "\n",
      " 思维导图菜鸟的速成秘籍\n",
      "思维 n \n",
      "导图 n \n",
      "菜鸟 n \n",
      "的 uj \n",
      "速成 v \n",
      "秘籍 n \n",
      "筛选词：['思维', '导图', '菜鸟', '秘籍']\n",
      "无 Embedding词： ['导图']\n",
      "\n",
      "\n",
      " 最强思维导图训练营\n",
      "最强 a \n",
      "思维 n \n",
      "导图 n \n",
      "训练营 n \n",
      "筛选词：['思维', '导图', '训练营']\n",
      "无 Embedding词： ['导图']\n",
      "\n",
      "\n",
      " 高效脑图：xmind8 零基础专项班\n",
      "高效 a \n",
      "脑图 n \n",
      "： x \n",
      "xmind8 eng \n",
      "  x \n",
      "零 m \n",
      "基础 n \n",
      "专项 n \n",
      "班 n \n",
      "筛选词：['脑图', '基础', '专项', '班']\n",
      "无 Embedding词： ['脑图']\n",
      "\n",
      "\n",
      " 思维导图入门到精通职场晋级秘籍\n",
      "思维 n \n",
      "导图 n \n",
      "入门 ns \n",
      "到 v \n",
      "精通 a \n",
      "职场 n \n",
      "晋级 nr \n",
      "秘籍 n \n",
      "筛选词：['思维', '导图', '入门', '职场', '晋级', '秘籍']\n",
      "无 Embedding词： ['导图']\n",
      "\n",
      "\n",
      " 思维导图高效学习法\n",
      "思维 n \n",
      "导图 n \n",
      "高效 a \n",
      "学习 v \n",
      "法 j \n",
      "筛选词：['思维', '导图']\n",
      "无 Embedding词： ['导图']\n",
      "时间管理\n",
      "\n",
      "\n",
      " 告别低效，人人必备的聪明工作法\n",
      "告别 v \n",
      "低效 a \n",
      "， x \n",
      "人人 n \n",
      "必备 v \n",
      "的 uj \n",
      "聪明 a \n",
      "工作 vn \n",
      "法 j \n",
      "筛选词：['人人']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 时间管理神器-OmniFocus for iOS\n",
      "时间 n \n",
      "管理 vn \n",
      "神器 n \n",
      "- x \n",
      "OmniFocus eng \n",
      "  x \n",
      "for eng \n",
      "  x \n",
      "iOS eng \n",
      "筛选词：['时间', '神器']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 跟邹小强学用滴答清单\n",
      "跟 p \n",
      "邹 nr \n",
      "小强 nr \n",
      "学 n \n",
      "用 p \n",
      "滴答 o \n",
      "清单 a \n",
      "筛选词：['邹', '小强', '学']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 和秋叶一起学时间管理\n",
      "和 c \n",
      "秋叶 t \n",
      "一起 m \n",
      "学 n \n",
      "时间 n \n",
      "管理 vn \n",
      "筛选词：['学', '时间']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 时间管理神器-OmniFocus for Mac\n",
      "时间 n \n",
      "管理 vn \n",
      "神器 n \n",
      "- x \n",
      "OmniFocus eng \n",
      "  x \n",
      "for eng \n",
      "  x \n",
      "Mac eng \n",
      "筛选词：['时间', '神器']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 跟邹小强学目标管理-年度计划\n",
      "跟 p \n",
      "邹 nr \n",
      "小强 nr \n",
      "学 n \n",
      "目标 n \n",
      "管理 vn \n",
      "- x \n",
      "年度计划 n \n",
      "筛选词：['邹', '小强', '学', '目标', '年度计划']\n",
      "无 Embedding词： []\n",
      "求职应聘\n",
      "\n",
      "\n",
      " 如何把握职场新机会\n",
      "如何 r \n",
      "把握 v \n",
      "职场 n \n",
      "新 a \n",
      "机会 n \n",
      "筛选词：['职场', '机会']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 明星学长手把手教你成为“面霸”\n",
      "明星 nr \n",
      "学长 n \n",
      "手把手 n \n",
      "教 v \n",
      "你 r \n",
      "成为 v \n",
      "“ x \n",
      "面霸 v \n",
      "” x \n",
      "筛选词：['明星', '学长', '手把手']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 真正的跳槽技巧，是什么样子的？\n",
      "真正 d \n",
      "的 uj \n",
      "跳槽 n \n",
      "技巧 n \n",
      "， x \n",
      "是 v \n",
      "什么 r \n",
      "样子 n \n",
      "的 uj \n",
      "？ x \n",
      "筛选词：['跳槽', '技巧', '样子']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " Offer收割术：15位HR圆你大厂梦\n",
      "Offer eng \n",
      "收割 v \n",
      "术 v \n",
      "： x \n",
      "15 m \n",
      "位 v \n",
      "HR eng \n",
      "圆 vg \n",
      "你 r \n",
      "大厂 n \n",
      "梦 n \n",
      "筛选词：['大厂', '梦']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 生涯规划咨询师教你如何修改简历\n",
      "生涯规划 l \n",
      "咨询师 n \n",
      "教 v \n",
      "你 r \n",
      "如何 r \n",
      "修改 v \n",
      "简历 v \n",
      "筛选词：['咨询师']\n",
      "无 Embedding词： []\n",
      "笔记工具\n",
      "\n",
      "\n",
      " 个人知识管理——为知笔记\n",
      "个人 n \n",
      "知识 v \n",
      "管理 vn \n",
      "— x \n",
      "— x \n",
      "为 p \n",
      "知 v \n",
      "笔记 n \n",
      "筛选词：['个人', '笔记']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 印象笔记—构建你的第二大脑系统\n",
      "印象 n \n",
      "笔记 n \n",
      "— x \n",
      "构建 v \n",
      "你 r \n",
      "的 uj \n",
      "第二 m \n",
      "大脑 n \n",
      "系统 n \n",
      "筛选词：['印象', '笔记', '大脑', '系统']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " Markdown使用教程（0.5小时精通）\n",
      "Markdown eng \n",
      "使用 v \n",
      "教程 n \n",
      "（ x \n",
      "0.5 m \n",
      "小时 n \n",
      "精通 a \n",
      "） x \n",
      "筛选词：['教程', '小时']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 秀米微信公众号排版实战教程\n",
      "秀 ag \n",
      "米 q \n",
      "微信 vn \n",
      "公众 n \n",
      "号 m \n",
      "排版 v \n",
      "实战 v \n",
      "教程 n \n",
      "筛选词：['公众', '教程']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 有道云笔记和有道云协作视频教程\n",
      "有 v \n",
      "道 q \n",
      "云 n \n",
      "笔记 n \n",
      "和 c \n",
      "有 v \n",
      "道 q \n",
      "云 n \n",
      "协作 vn \n",
      "视频教程 n \n",
      "筛选词：['云', '笔记', '云', '视频教程']\n",
      "无 Embedding词： []\n",
      "管理能力\n",
      "\n",
      "\n",
      " 高效经理的7项实战\n",
      "高效 a \n",
      "经理 n \n",
      "的 uj \n",
      "7 m \n",
      "项 n \n",
      "实战 v \n",
      "筛选词：['经理', '项']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 领导学  成长型企业家必修课\n",
      "领导 n \n",
      "学 n \n",
      "  x \n",
      "  x \n",
      "成长型 n \n",
      "企业家 n \n",
      "必修课 n \n",
      "筛选词：['领导', '学', '成长型', '企业家', '必修课']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 创新型组织行为模式-组织行为学\n",
      "创新型 n \n",
      "组织 v \n",
      "行为 v \n",
      "模式 n \n",
      "- x \n",
      "组织 v \n",
      "行为学 l \n",
      "筛选词：['创新型', '模式']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 【英盛网】管理者培训班\n",
      "【 x \n",
      "英盛 nz \n",
      "网 n \n",
      "】 x \n",
      "管理者 n \n",
      "培训班 n \n",
      "筛选词：['英盛', '网', '管理者', '培训班']\n",
      "无 Embedding词： ['英盛']\n",
      "\n",
      "\n",
      " 如何成为一名优秀的领导者——《领导力挑战》\n",
      "如何 r \n",
      "成为 v \n",
      "一名 m \n",
      "优秀 a \n",
      "的 uj \n",
      "领导者 n \n",
      "— x \n",
      "— x \n",
      "《 x \n",
      "领导力 n \n",
      "挑战 vn \n",
      "》 x \n",
      "筛选词：['领导者', '领导力']\n",
      "无 Embedding词： []\n",
      "职业形象\n",
      "\n",
      "\n",
      " 超实用商务礼仪\n",
      "超 v \n",
      "实用 v \n",
      "商务礼仪 n \n",
      "筛选词：['商务礼仪']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 十堂礼仪课，轻松HOLD住各种场合\n",
      "十堂 m \n",
      "礼仪 n \n",
      "课 n \n",
      "， x \n",
      "轻松 a \n",
      "HOLD eng \n",
      "住 v \n",
      "各种 r \n",
      "场合 n \n",
      "筛选词：['礼仪', '课', '场合']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 12堂声音美化课，全面提升个人魅力\n",
      "12 m \n",
      "堂 q \n",
      "声音 n \n",
      "美化 ns \n",
      "课 n \n",
      "， x \n",
      "全面 n \n",
      "提升 v \n",
      "个人 n \n",
      "魅力 n \n",
      "筛选词：['声音', '美化', '课', '全面', '个人', '魅力']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 升职加薪：新人职业发展必备技能\n",
      "升职 v \n",
      "加薪 nr \n",
      "： x \n",
      "新人 n \n",
      "职业 n \n",
      "发展 vn \n",
      "必备 v \n",
      "技能 n \n",
      "筛选词：['加薪', '新人', '职业', '技能']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 个人品牌入门到精通\n",
      "个人 n \n",
      "品牌 n \n",
      "入门 ns \n",
      "到 v \n",
      "精通 a \n",
      "筛选词：['个人', '品牌', '入门']\n",
      "无 Embedding词： []\n",
      "职业规划\n",
      "\n",
      "\n",
      " 职场加速器 | 加速职场成长\n",
      "职场 n \n",
      "加速器 n \n",
      "  x \n",
      "| x \n",
      "  x \n",
      "加速 v \n",
      "职场 n \n",
      "成长 v \n",
      "筛选词：['职场', '加速器', '职场']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 重构你喜爱的人生\n",
      "重构 n \n",
      "你 r \n",
      "喜爱 v \n",
      "的 uj \n",
      "人生 n \n",
      "筛选词：['重构', '人生']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 职场向上管理：如何搞定你的老板\n",
      "职场 n \n",
      "向上 d \n",
      "管理 vn \n",
      "： x \n",
      "如何 r \n",
      "搞定 v \n",
      "你 r \n",
      "的 uj \n",
      "老板 n \n",
      "筛选词：['职场', '老板']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 突围职业规划，如何找份好工作\n",
      "突围 n \n",
      "职业规划 n \n",
      "， x \n",
      "如何 r \n",
      "找 v \n",
      "份 q \n",
      "好 a \n",
      "工作 vn \n",
      "筛选词：['突围', '职业规划']\n",
      "无 Embedding词： []\n",
      "\n",
      "\n",
      " 高效迭代：30天赢在职业生涯起点\n",
      "高效 a \n",
      "迭代 v \n",
      "： x \n",
      "30 m \n",
      "天 q \n",
      "赢 v \n",
      "在 p \n",
      "职业生涯 n \n",
      "起点 n \n",
      "筛选词：['职业生涯', '起点']\n",
      "无 Embedding词： []\n",
      "{'A1': ['有趣的心理学：职场创业营销必备', ['心理学', '职场', '创业'], []], 'A2': ['创业思维：菜鸟该如何创业', ['创业', '思维', '菜鸟', '创业'], []], 'A3': ['商业模式精讲', ['商业模式'], []], 'A4': ['如何写商业计划书', ['商业', '计划书'], []], 'A5': ['新手开公司课程', ['新手', '公司', '课程'], []], 'B1': ['思维导图菜鸟的速成秘籍', ['思维', '导图', '菜鸟', '秘籍'], ['导图']], 'B2': ['最强思维导图训练营', ['思维', '导图', '训练营'], ['导图']], 'B3': ['高效脑图：xmind8 零基础专项班', ['脑图', '基础', '专项', '班'], ['脑图']], 'B4': ['思维导图入门到精通职场晋级秘籍', ['思维', '导图', '入门', '职场', '晋级', '秘籍'], ['导图']], 'B5': ['思维导图高效学习法', ['思维', '导图'], ['导图']], 'C1': ['告别低效，人人必备的聪明工作法', ['人人'], []], 'C2': ['时间管理神器-OmniFocus for iOS', ['时间', '神器'], []], 'C3': ['跟邹小强学用滴答清单', ['邹', '小强', '学'], []], 'C4': ['和秋叶一起学时间管理', ['学', '时间'], []], 'C5': ['时间管理神器-OmniFocus for Mac', ['时间', '神器'], []], 'C6': ['跟邹小强学目标管理-年度计划', ['邹', '小强', '学', '目标', '年度计划'], []], 'D1': ['如何把握职场新机会', ['职场', '机会'], []], 'D2': ['明星学长手把手教你成为“面霸”', ['明星', '学长', '手把手'], []], 'D3': ['真正的跳槽技巧，是什么样子的？', ['跳槽', '技巧', '样子'], []], 'D4': ['Offer收割术：15位HR圆你大厂梦', ['大厂', '梦'], []], 'D5': ['生涯规划咨询师教你如何修改简历', ['咨询师'], []], 'E1': ['个人知识管理——为知笔记', ['个人', '笔记'], []], 'E2': ['印象笔记—构建你的第二大脑系统', ['印象', '笔记', '大脑', '系统'], []], 'E3': ['Markdown使用教程（0.5小时精通）', ['教程', '小时'], []], 'E4': ['秀米微信公众号排版实战教程', ['公众', '教程'], []], 'E5': ['有道云笔记和有道云协作视频教程', ['云', '笔记', '云', '视频教程'], []], 'F1': ['高效经理的7项实战', ['经理', '项'], []], 'F2': ['领导学  成长型企业家必修课', ['领导', '学', '成长型', '企业家', '必修课'], []], 'F3': ['创新型组织行为模式-组织行为学', ['创新型', '模式'], []], 'F4': ['【英盛网】管理者培训班', ['英盛', '网', '管理者', '培训班'], ['英盛']], 'F5': ['如何成为一名优秀的领导者——《领导力挑战》', ['领导者', '领导力'], []], 'G1': ['超实用商务礼仪', ['商务礼仪'], []], 'G2': ['十堂礼仪课，轻松HOLD住各种场合', ['礼仪', '课', '场合'], []], 'G3': ['12堂声音美化课，全面提升个人魅力', ['声音', '美化', '课', '全面', '个人', '魅力'], []], 'G4': ['升职加薪：新人职业发展必备技能', ['加薪', '新人', '职业', '技能'], []], 'G5': ['个人品牌入门到精通', ['个人', '品牌', '入门'], []], 'H1': ['职场加速器 | 加速职场成长', ['职场', '加速器', '职场'], []], 'H2': ['重构你喜爱的人生', ['重构', '人生'], []], 'H3': ['职场向上管理：如何搞定你的老板', ['职场', '老板'], []], 'H4': ['突围职业规划，如何找份好工作', ['突围', '职业规划'], []], 'H5': ['高效迭代：30天赢在职业生涯起点', ['职业生涯', '起点'], []]}\n",
      "[[1.         0.77557468 0.39339258 ... 0.91763599 0.56589062 0.41432663]\n",
      " [0.77557468 1.         0.49675763 ... 0.62888644 0.49180171 0.40293036]\n",
      " [0.39339258 0.49675763 0.99999999 ... 0.31887356 0.40678456 0.23859834]\n",
      " ...\n",
      " [0.91763599 0.62888644 0.31887356 ... 1.         0.50645623 0.3700186 ]\n",
      " [0.56589062 0.49180171 0.40678456 ... 0.50645623 0.99999999 0.42116711]\n",
      " [0.41432663 0.40293036 0.23859834 ... 0.3700186  0.42116711 0.99999999]]\n",
      "A1 有趣的心理学：职场创业营销必备\n",
      "A2 创业思维：菜鸟该如何创业\n",
      "A3 商业模式精讲\n",
      "A4 如何写商业计划书\n",
      "A5 新手开公司课程\n",
      "B1 思维导图菜鸟的速成秘籍\n",
      "B2 最强思维导图训练营\n",
      "B3 高效脑图：xmind8 零基础专项班\n",
      "B4 思维导图入门到精通职场晋级秘籍\n",
      "B5 思维导图高效学习法\n",
      "C1 告别低效，人人必备的聪明工作法\n",
      "C2 时间管理神器-OmniFocus for iOS\n",
      "C3 跟邹小强学用滴答清单\n",
      "C4 和秋叶一起学时间管理\n",
      "C5 时间管理神器-OmniFocus for Mac\n",
      "C6 跟邹小强学目标管理-年度计划\n",
      "D1 如何把握职场新机会\n",
      "D2 明星学长手把手教你成为“面霸”\n",
      "D3 真正的跳槽技巧，是什么样子的？\n",
      "D4 Offer收割术：15位HR圆你大厂梦\n",
      "D5 生涯规划咨询师教你如何修改简历\n",
      "E1 个人知识管理——为知笔记\n",
      "E2 印象笔记—构建你的第二大脑系统\n",
      "E3 Markdown使用教程（0.5小时精通）\n",
      "E4 秀米微信公众号排版实战教程\n",
      "E5 有道云笔记和有道云协作视频教程\n",
      "F1 高效经理的7项实战\n",
      "F2 领导学  成长型企业家必修课\n",
      "F3 创新型组织行为模式-组织行为学\n",
      "F4 【英盛网】管理者培训班\n",
      "F5 如何成为一名优秀的领导者——《领导力挑战》\n",
      "G1 超实用商务礼仪\n",
      "G2 十堂礼仪课，轻松HOLD住各种场合\n",
      "G3 12堂声音美化课，全面提升个人魅力\n",
      "G4 升职加薪：新人职业发展必备技能\n",
      "G5 个人品牌入门到精通\n",
      "H1 职场加速器 | 加速职场成长\n",
      "H2 重构你喜爱的人生\n",
      "H3 职场向上管理：如何搞定你的老板\n",
      "H4 突围职业规划，如何找份好工作\n",
      "H5 高效迭代：30天赢在职业生涯起点\n"
     ]
    }
   ],
   "source": [
    "data = {\n",
    "    \"商业实战\": [\n",
    "        \"有趣的心理学：职场创业营销必备\",\n",
    "        \"创业思维：菜鸟该如何创业\",\n",
    "        \"商业模式精讲\",\n",
    "        \"如何写商业计划书\",\n",
    "        \"新手开公司课程\"\n",
    "    ],\n",
    "    \"思维导图\": [\n",
    "        \"思维导图菜鸟的速成秘籍\",\n",
    "        \"最强思维导图训练营\",\n",
    "        \"高效脑图：xmind8 零基础专项班\",\n",
    "        \"思维导图入门到精通职场晋级秘籍\",\n",
    "        \"思维导图高效学习法\"\n",
    "    ],\n",
    "    \"时间管理\": [\n",
    "        \"告别低效，人人必备的聪明工作法\",\n",
    "        \"时间管理神器-OmniFocus for iOS\",\n",
    "        \"跟邹小强学用滴答清单\",\n",
    "        \"和秋叶一起学时间管理\",\n",
    "        \"时间管理神器-OmniFocus for Mac\",\n",
    "        \"跟邹小强学目标管理-年度计划\"\n",
    "    ],\n",
    "    \"求职应聘\": [\n",
    "        \"如何把握职场新机会\",\n",
    "        \"明星学长手把手教你成为“面霸”\",\n",
    "        \"真正的跳槽技巧，是什么样子的？\",\n",
    "        \"Offer收割术：15位HR圆你大厂梦\",\n",
    "        \"生涯规划咨询师教你如何修改简历\"\n",
    "    ],\n",
    "    \"笔记工具\": [\n",
    "        \"个人知识管理——为知笔记\",\n",
    "        \"印象笔记—构建你的第二大脑系统\",\n",
    "        \"Markdown使用教程（0.5小时精通）\",\n",
    "        \"秀米微信公众号排版实战教程\",\n",
    "        \"有道云笔记和有道云协作视频教程\"\n",
    "    ],\n",
    "    \"管理能力\": [\n",
    "        \"高效经理的7项实战\",\n",
    "        \"领导学  成长型企业家必修课\",\n",
    "        \"创新型组织行为模式-组织行为学\",\n",
    "        \"【英盛网】管理者培训班\",\n",
    "        \"如何成为一名优秀的领导者——《领导力挑战》\"\n",
    "    ],\n",
    "    \"职业形象\": [\n",
    "        \"超实用商务礼仪\",\n",
    "        \"十堂礼仪课，轻松HOLD住各种场合\",\n",
    "        \"12堂声音美化课，全面提升个人魅力\",\n",
    "        \"升职加薪：新人职业发展必备技能\",\n",
    "        \"个人品牌入门到精通\"\n",
    "    ],\n",
    "    \"职业规划\": [\n",
    "        \"职场加速器 | 加速职场成长\",\n",
    "        \"重构你喜爱的人生\",\n",
    "        \"职场向上管理：如何搞定你的老板\",\n",
    "        \"突围职业规划，如何找份好工作\",\n",
    "        \"高效迭代：30天赢在职业生涯起点\"\n",
    "    ]\n",
    "}\n",
    "\n",
    "# 获取词权重\n",
    "word_weight = get_word_weight(data)\n",
    "\n",
    "# Embedding 数据库\n",
    "embedding_sql = SQLite(r'D:\\PreTrainedModel\\WordEmbedding.db', 'GitEmbedding')\n",
    "\n",
    "s_data = dict()\n",
    "s_embedding = list()\n",
    "\n",
    "for l_1, (label, values) in enumerate(data.items()):\n",
    "    print(label)\n",
    "\n",
    "    for l_2, line_i in enumerate(values):\n",
    "        line_i = line_i.strip()\n",
    "\n",
    "        print('\\n\\n', line_i)\n",
    "\n",
    "        # 句子向量获取\n",
    "        used_word, non_embedding_word, word_embedding_mean = sentence_embedding(\n",
    "            embedding_sql, word_weight, line_i, debug=True)\n",
    "\n",
    "        s_embedding.append(word_embedding_mean)\n",
    "        s_data['{}{}'.format(chr(65 + l_1), l_2 + 1)] = [line_i, used_word, non_embedding_word]\n",
    "\n",
    "s_embedding = np.array(s_embedding)\n",
    "\n",
    "print(s_data)\n",
    "# 计算相似度\n",
    "s_similar = cos_similar(s_embedding, s_embedding)\n",
    "\n",
    "print(s_similar)\n",
    "\n",
    "with open('Similar.csv', 'w', encoding='utf-8') as f:\n",
    "    print('{},{},{},{},{}'.format('', '课程名称', '使用词', '随机Embedding词',\n",
    "                                  ','.join(s_data.keys())), file=f)\n",
    "\n",
    "    for i, (label_i, (word_i, used_word_i, non_embedding_word_i)) in enumerate(s_data.items()):\n",
    "        print(label_i, word_i)\n",
    "        print('{},{},{},{},{}'.format(label_i, word_i, '、'.join(used_word_i), '、'.join(non_embedding_word_i),\n",
    "                                      ('{:.3f},' * len(s_data)).format(*s_similar[i])), file=f)\n",
    "\n",
    "# 关闭数据库\n",
    "embedding_sql.close()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "PY36-tf12",
   "language": "python",
   "name": "py36_b"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
